<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>属性特征</title>
</head>
<body>
    
</body>
</html>
<script>
    //JS中可以对属性的访问特征进行控制
    //查看特性
    "use strict";
    // const user = {
    //     name : "向军",
    //     age : 18
    // };
    //查看对象中某个属性的特性
    //使用Object.getOwnPropertyDescriptor 获取属性特征
    // let desc = Object.getOwnPropertyDescriptor(user,'name');
    // console.log(JSON.stringify(desc,null,2));

    //使用Object.getOwnProtopertyDescriptiptors(user)获取对象中所有属性的特征
    // let descs = Object.getOwnPropertyDescriptors(user);
    // console.log(JSON.stringify(descs,null,2));

    //设置特征
    // Object.defineProperty(user,"name",{
    //     value : '后盾人',
    //     writable:false,
    //     enumerable:false,
    //     configurable:false
    // });

    // console.log(user)//user的颜色是浅色的   不能被修改
    // user.name = '向军';//不允许修改

    //name 不允许遍历  只遍历出了age
    // console.log(Object.keys(user));

    //不允许删除
    // delete user.name;

    //不允许配置
    // Object.defineProperty(user,"name",{
    //     value : '后盾人',
    //     writable : true,
    //     enumerable : false,
    //     configurable:false
    // });


    //一次设置多个属性
    //也就是说 属性不但可以进行设置   进行修改定制  还可以进行添加并且设置好属性
    // let user = {};
    // Object.defineProperties(user,{
    //     name : {value:'向军',writable:true,enumerable:true},
    //     age : {value:18,writable:true,enumerable:true}
    // });
    // // console.log(user)
    // // user.age = 15;
    // // console.log(user)
    // console.log(Object.keys(user))

    //============================禁止添加========================

    //禁止往对象中添加属性
    // const user = {
    //     name : "向军"
    // };
    // //使用  Object.preventExtensions(user)
    // //禁止向对象中添加属性
    // Object.preventExtensions(user);
    // // user.age = 15;
    // // console.log(user)

    // //使用Object.isEctensible判断是否能向对象中添加属性
    // // console.log(Object.isExtensible(user));
    // if(Object.isExtensible(user)){
    //     user.age = 15;
    // }
    // console.log(user)


    //封闭对象==================================================
    // const user = {
    //     name : "后盾人",
    //     age : 18
    // };
    // //将属性特征封闭之后   所有属性的  configurable 都为false了  所以就不能对属性进行自定义配置了
    // Object.seal(user);
    // console.log(
    //     JSON.stringify(Object.getOwnPropertyDescriptors(user),null,2)
    // );

    // //判断对象是否被封闭
    // // console.log(Object.isSealed(user));
    // if(!Object.isSealed(user)){
    //     delete user.age;
    // }
    
    // console.log(user)


    //冻结对象===================================
    //使用Object.freeze 冻结对象  之后   不允许添加，删除，修改属性
    //writable,configurable 都标记为false
    const user = {
        name : "向军"
    };
    Object.freeze(user);
    // user.name = 'hdcms';
    // console.log(user)

    //使用Object.isFrozen() 方法判断一个对象是否被冻结
    // console.log(Object.isFrozen(user));
    if(!Object.isFrozen(user)){
        user.name = 'hdmccs';
    }
    console.log(user)



    






    

</script>